home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 1 / Cream of the Crop 1.iso / WINDOWS / PROFFT.ARJ / PROFFTDB.CPP < prev    next >
C/C++ Source or Header  |  1992-04-27  |  31KB  |  828 lines

  1. /****************************************************************************
  2.     PROFFTDB.CPP        Denne filen inneholder (i denne rekkef°lgen):
  3. *****************************************************************************
  4. TOptions::TOptions(PTWindowsObject AParent, LPSTR AName)
  5.         : TDialog(AParent, AName)
  6. void TOptions::WMInitDialog(RTMessage Msg)
  7. void TOptions::IDHScrollBar(RTMessage)
  8. void TOptions::WMHScroll(RTMessage Msg)
  9. void TOptions::WMCommand(RTMessage Msg)
  10. void TOptions::CloseWindow(int iRetValue)
  11. TProgressDialog::TProgressDialog(PTWindowsObject AParent, LPSTR lpszDialogName,
  12.         LPSTR lpszCaption) : TDialog(AParent, lpszDialogName)
  13. TProgressDialog::~TProgressDialog()
  14. void TProgressDialog::WMInitDialog(RTMessage Msg)
  15. void TProgressDialog::WMSetText(RTMessage Msg)
  16. void TProgressDialog::WMSetProgress(RTMessage Msg)
  17. void TProgressDialog::WMCommand(RTMessage)
  18. BOOL TProgressDialog::CancelPressed()
  19. LPSTR alpTitle[6] = {"Lowpass", "Highpass", "Bandpass", "Bandstop", "Butterworth highpass", "Butterworth lowpass"};
  20. TFilter2::TFilter2(PTWindowsObject AParent, LPSTR AName)
  21.         : TDialog(AParent, AName)
  22. void TFilter2::UpdateParent()
  23. void TFilter2::WMInitDialog(RTMessage Msg)
  24. void TFilter2::WMHScroll(RTMessage Msg)
  25. void TFilter2::IDHScrollBar1(RTMessage Msg)
  26. void TFilter2::IDHScrollBar2(RTMessage Msg)
  27. void TFilter2::IDEditFrequency1(RTMessage Msg)
  28. void TFilter2::IDEditFrequency2(RTMessage Msg)
  29. BOOL TFilter2::CanClose()
  30. TFilter1::TFilter1(PTWindowsObject AParent, LPSTR AName)
  31.         : TDialog(AParent, AName)
  32. void TFilter1::UpdateParent()
  33. void TFilter1::WMInitDialog(RTMessage Msg)
  34. void TFilter1::IDHScrollBar(RTMessage Msg)
  35. void TFilter1::WMHScroll(RTMessage Msg)
  36. void TFilter1::IDEditFrequency(RTMessage Msg)
  37. BOOL TFilter1::CanClose()
  38. void TComplexWindow::ExecuteSmallDialog()
  39. void TComplexWindow::ExecuteLargeDialog()
  40. ****************************************************************************/
  41.  
  42. #include <owl.h>
  43. #include <dialog.h>
  44. #include <edit.h>
  45. #include <scrollba.h>
  46. #include <checkbox.h>
  47. #include <radiobut.h>
  48. #include <dir.h>
  49. #include <string.h>
  50. #include <math.h>
  51. #include <stdio.h>
  52.  
  53. #pragma hdrstop
  54. #include "profftid.h" // Symbolske konstanter
  55. #include "profft.h"   // Klassedefinisjoner
  56.  
  57. TOptions::TOptions(PTWindowsObject AParent, LPSTR AName)
  58.         : TDialog(AParent, AName)
  59. /****************************************************************************
  60. Dette er dialogboksen som lar brukeren forandre pσ standardopsjonene i programmet.
  61. Allokerer objektene i dialogboksen. Sender parametrene videre til
  62. superklassen som henter dialogboksen fra ressursfilen.
  63.  
  64. PTWindowsObject AParent        Peker til foreldreobjektet.
  65. LPSTR AName                                Navnet pσ dialogboksen i ressursfilen.
  66.  
  67. Kodet av:   MK    20.04.92
  68. *****************************************************************************/
  69. {
  70.     new TScrollBar(this, DB_SCROLLRUBBER);
  71.     new TRadioButton(this, DB_RADIOCIRCLERUBBER, NULL);
  72.     new TRadioButton(this, DB_RADIOSQUARERUBBER, NULL);
  73.     new TCheckBox(this, DB_TOGGLESHIFTCENTER, NULL, NULL);
  74. }
  75.  
  76. void TOptions::WMInitDialog(RTMessage Msg)
  77. /****************************************************************************
  78. Setter standardverdiene i dialogboksen.
  79.  
  80. RTMessage Msg        Sendes videre til superklassen.
  81.  
  82. Kodet av:   MK    20.04.92
  83. *****************************************************************************/
  84. {
  85.     char acMax[10];
  86.     char acTemp[3];
  87.     int iSize;
  88.  
  89.     TDialog::WMInitDialog(Msg);
  90.  
  91.     iSize=((TMainWindow *)Parent)->GetRubberSize();
  92.     wsprintf(acTemp, "%i", iSize);
  93.     SetDlgItemText(HWindow, DB_TEST, acTemp);
  94.  
  95.     //  Setter maks/min verdier for viskelµret og nσvµrende posisjon pσ
  96.     //  scrollbaren.
  97.     SetScrollRange(GetItemHandle(DB_SCROLLRUBBER), SB_CTL, 1, MAX_RUBBER_SIZE, TRUE);
  98.     SetScrollPos(GetItemHandle(DB_SCROLLRUBBER), SB_CTL, iSize, TRUE);
  99.  
  100.     //  Setter riktig button i dialogboksen m.h.p. type viskelµr
  101.     CheckRadioButton(HWindow, DB_RADIOCIRCLERUBBER, DB_RADIOSQUARERUBBER,
  102.             bCircleRubber?DB_RADIOCIRCLERUBBER:DB_RADIOSQUARERUBBER);
  103.  
  104.     //  Krysser av hvis komplekse bilder sentreres
  105.     CheckDlgButton(HWindow, DB_TOGGLESHIFTCENTER, bShiftCenter?1:0);
  106. }
  107.  
  108. void TOptions::IDHScrollBar(RTMessage)
  109. /****************************************************************************
  110. Mottar beskjed nσ brukeren benytter scrollbaren. Oppdaterer tallverdi
  111. pσ skjermen i dialogboksen.
  112.  
  113. Kodet av:   MK    20.04.92
  114. *****************************************************************************/
  115. {
  116.     char acTemp[10];
  117.  
  118.     //  Gj°r om tallverdien til tekst og viser teksten.
  119.     wsprintf(acTemp, "%d", GetScrollPos(GetItemHandle(DB_SCROLLRUBBER), SB_CTL));
  120.     SetDlgItemText(HWindow, DB_TEST, acTemp);
  121. }
  122.  
  123. void TOptions::WMHScroll(RTMessage Msg)
  124. /****************************************************************************
  125. Mottar beskjed nσ brukeren benytter drar scrollbaren. Oppdaterer tallverdi
  126. pσ skjermen i dialogboksen.
  127.  
  128. Kodet av:   MK    20.04.92
  129. *****************************************************************************/
  130. {
  131.     char acTemp[3];
  132.  
  133.     if ((Msg.WParam==SB_THUMBPOSITION) || (Msg.WParam==SB_THUMBTRACK))
  134.     {
  135.         wsprintf(acTemp, "%d", GetScrollPos(GetItemHandle(DB_SCROLLRUBBER), SB_CTL));
  136.         SetDlgItemText(HWindow, DB_TEST, acTemp);
  137.     }
  138.     TDialog::WMHScroll(Msg);
  139. }
  140.  
  141. void TOptions::WMCommand(RTMessage Msg)
  142. /****************************************************************************
  143. Mottar beskjed nσ brukeren trykker pσ en av radiobutton knappene. Passer
  144. pσ σ trykke av den av de som ikke blir trykket pσ. (Kan bare velge en
  145. av gangen).
  146.  
  147. Kodet av:   MK    20.04.92
  148. *****************************************************************************/
  149. {
  150.     if ((Msg.WParam==DB_RADIOCIRCLERUBBER) || (Msg.WParam==DB_RADIOSQUARERUBBER))
  151.         CheckRadioButton(HWindow, DB_RADIOCIRCLERUBBER, DB_RADIOSQUARERUBBER,
  152.                 Msg.WParam==DB_RADIOCIRCLERUBBER?DB_RADIOCIRCLERUBBER:DB_RADIOSQUARERUBBER);
  153.     else
  154.         TDialog::WMCommand(Msg);
  155. }
  156.  
  157. void TOptions::CloseWindow(int iRetValue)
  158. /****************************************************************************
  159. Hvis brukeren trykker pσ OK knappen ta vare pσ verdiene, hvis ikke
  160. forkast de.
  161.  
  162. Kodet av:   MK    20.04.92
  163. *****************************************************************************/
  164. {
  165.     //  Hvis OK knappen er trykket oppdater verdiene.
  166.     if (iRetValue==IDOK)
  167.     {
  168.         bCircleRubber=IsDlgButtonChecked(HWindow, DB_RADIOCIRCLERUBBER)?TRUE:FALSE;
  169.         ((TMainWindow *)Parent)->SetRubberSize(GetScrollPos(GetItemHandle(DB_SCROLLRUBBER), SB_CTL));
  170.         bShiftCenter=IsDlgButtonChecked(HWindow,DB_TOGGLESHIFTCENTER)?TRUE:FALSE;
  171.     }
  172.     TDialog::CloseWindow(iRetValue);
  173. }
  174.  
  175. TProgressDialog::TProgressDialog(PTWindowsObject AParent, LPSTR lpszDialogName,
  176.         LPSTR lpszCaption) : TDialog(AParent, lpszDialogName)
  177. /****************************************************************************
  178. Oppretter statusvinduet som viser hvor langt vi er kommet i en tidkrevende
  179. prosess.
  180.  
  181. PTWindowsObject AParent   Peker til foreldreobjektet.
  182. LPSTR lpszDialogName          Navnet pσ dialogboksen i ressursfilen.
  183. LPSTR lpszCaption                  Overskriften pσ vinduet.
  184.  
  185. Kodet av:   MK    20.04.92
  186. *****************************************************************************/
  187.  
  188. {
  189.     //  Setter overskriften pσ dialogboksen
  190.     SetCaption(lpszCaption);
  191.  
  192.     //  Setter startverdier
  193.     lSoFar = 0;
  194.     bCancel = FALSE;
  195.     strcpy(acMessage, "");
  196.  
  197.     //  Allokerer kontrollene i dialogboksen
  198.     new TStatic(this, DB_TEXT, DB_TEXTLENGTH, NULL);
  199.     new TStatic(this, DB_PERCENTAGE, 5, NULL);
  200.     new TStatic(this, DB_PAINTAREA, 0, NULL);
  201. }
  202.  
  203. TProgressDialog::~TProgressDialog()
  204. /****************************************************************************
  205. Frigj°r ressursene som denne dialogboksen har allokert. Disse ressursene
  206. allokeres ikke i konstruktoren, men i WMInitDialog medlemsfunksjonen.
  207.  
  208. Kodet av:   MK    20.04.92
  209. *****************************************************************************/
  210.  
  211. {
  212.     DeleteObject(hBrush);
  213.     ReleaseDC(HWindow, hdc);
  214. }
  215.  
  216. void TProgressDialog::WMInitDialog(RTMessage Msg)
  217. /****************************************************************************
  218. Oppretter og henter data om ressursene som brukes i dialogboksen.
  219. Lager brushen det tegnes med og henter omrσdet som skal males og lagrer
  220. dette i rect.
  221.  
  222. RTMessage Msg        Sendes videre til superklassen.
  223.  
  224. Kodet av:   MK    20.04.92
  225. *****************************************************************************/
  226.  
  227. {
  228.     TDialog::WMInitDialog(Msg);
  229.  
  230.     //  Hent og lagre omrσdet som skal fargelegges
  231.     hCtrl = GetDlgItem(HWindow, DB_PAINTAREA);
  232.     hdc = GetDC(hCtrl);
  233.     GetClientRect(hCtrl, &rect);
  234.  
  235.     //  Lag brushen som det skal tegnes med i omrσdet som skal fargelegges.
  236.     hBrush = CreateSolidBrush(GetSysColor(COLOR_ACTIVECAPTION));
  237.     hBrush = SelectObject(hdc, hBrush);
  238.     SetROP2(hdc, R2_COPYPEN);
  239. }
  240.  
  241. void TProgressDialog::WMSetText(RTMessage Msg)
  242. /****************************************************************************
  243. Mottar beskjed fra det aktive objektet om at statusteksten skal forandres.
  244. Denne skifter teksten som vises i dialogboksen.
  245.  
  246. RTMessage Msg        Peker til strengen som skal vises.
  247.  
  248. Kodet av:   MK    20.04.92
  249. *****************************************************************************/
  250. {
  251.     SetDlgItemText(HWindow, DB_TEXT, (LPSTR) Msg.LParam);
  252. }
  253.  
  254. void TProgressDialog::WMSetProgress(RTMessage Msg)
  255. /****************************************************************************
  256. Mottar beskjed fra det aktive objektet om at vi mσ vise hvor langt vi
  257. er kommet hittil.
  258.  
  259. RTMessage Msg        Hvor langt vi er hittil (i % ganger 100).
  260.  
  261. Kodet av:   MK    20.04.92
  262. *****************************************************************************/
  263. {
  264.     //  Hvis vi har kommet lenger enn vi var sist..
  265.     if (Msg.LParam!=lSoFar)
  266.     {
  267.         lSoFar = Msg.LParam;
  268.  
  269.         //  Vis prosentomrσdet og oppdater % teksten.
  270.         wsprintf(acPercentage, "%ld%%", lSoFar);
  271.         Rectangle(hdc, rect.left,  rect.top,
  272.                 (long) (rect.left + ((rect.right-rect.left)*lSoFar)/100), rect.bottom);
  273.         SetDlgItemText(HWindow, DB_PERCENTAGE, acPercentage);
  274.         UpdateWindow(hCtrl);
  275.     }
  276. }
  277.  
  278. void TProgressDialog::WMCommand(RTMessage)
  279. /****************************************************************************
  280. Mottar beskjed fra dialogboksen om at brukeren har trykket pσ Cancel
  281. knappen og °nsker σ avbryte den nσvµrende operasjonen.
  282.  
  283. Kodet av:   MK    20.04.92
  284. *****************************************************************************/
  285.  
  286. {
  287.     bCancel = TRUE;
  288. }
  289.  
  290. BOOL TProgressDialog::CancelPressed()
  291. /****************************************************************************
  292. Sjekker om brukeren har trykket pσ Cancelknappen siden sist vi sjekket.
  293.  
  294. Returnerer:        TRUE   Hvis knappet er blitt trykket ned
  295.                             FALSE  Hvis ikke..
  296.  
  297. RTMessage Msg        Peker til strengen som skal vises.
  298.  
  299. Kodet av:   MK    20.04.92
  300. *****************************************************************************/
  301. {
  302.     MSG msg;
  303.  
  304.     //  Motta kun beskjeder til denne dialogboksen, send de andre
  305.     //  videre.
  306.     while (!bCancel && PeekMessage(&msg, HWindow, 0, 0, PM_REMOVE))
  307.     {
  308.         if (IsDialogMessage(HWindow, &msg))
  309.         {
  310.             TranslateMessage(&msg);
  311.             DispatchMessage(&msg);
  312.         }
  313.     }
  314.  
  315.     //  Returner status sσ langt.
  316.     return bCancel;
  317. }
  318.  
  319. //  Tabellen under brukes av filterdialogboksene i overskriften for
  320. //  σ vise hvilket filter vi holder pσ med.
  321.  
  322. LPSTR alpTitle[6] = {"Lowpass", "Highpass", "Bandpass", "Bandstop", "Butterworth highpass", "Butterworth lowpass"};
  323.  
  324. TFilter2::TFilter2(PTWindowsObject AParent, LPSTR AName)
  325.         : TDialog(AParent, AName)
  326. /****************************************************************************
  327. Dette er dialogboksen som brukes ved alle filtre som krever to radiuser.
  328. Dvs. CM_FILTERBANDPASS, CM_FILTERBANDSTOPP. Konstruktoren bare setter opp
  329. kontrollene i dialogboksen.
  330.  
  331. PTWindowsObject AParent        Peker til foreldreobjektet. Sendes uber°rt
  332.                                                     videre til superklassen.
  333.  
  334. LPSTR AName                                Navnet pσ dialogboksen i ressursfilen. Sendes
  335.                                                     uber°rt videre til superklassen.
  336.  
  337. Kodet av:    SA
  338. Modifisert:     MK     22.04.92  La inn dynamisk oppdatering av editkontrollene
  339.                                                      og oppdatering av foreldrevinduet.
  340. *****************************************************************************/
  341. {
  342.         new TEdit(this, DB_EDITFREQUENCY1, DB_EDITFREQUENCYLENGTH);
  343.         new TEdit(this, DB_EDITFREQUENCY2, DB_EDITFREQUENCYLENGTH);
  344.         new TScrollBar(this, DB_SCROLLFREQUENCY1);
  345.         new TScrollBar(this, DB_SCROLLFREQUENCY2);
  346. }
  347.  
  348. void TFilter2::UpdateParent()
  349. /****************************************************************************
  350. Denne oppdaterer foreldreobjektet med de rette verdiene som brukeren
  351. velger v.h.a. dialogboksen.
  352.  
  353. Kodet av:    SA
  354. Modifisert:     MK     22.04.92  La inn dynamisk oppdatering av editkontrollene
  355.                                                      og oppdatering av foreldrevinduet.
  356. *****************************************************************************/
  357. {
  358.     TComplexWindow *ptWin;
  359.  
  360.     ptWin = ((TComplexWindow *)Parent);
  361.  
  362.     //  Setter °vre og nedre radius, ber foreldre vinduet oppdatere seg
  363.     //  selv, dvs. vise r°de ringer pσ filteret.
  364.     ptWin->iLowerValue = GetScrollPos(GetItemHandle(DB_SCROLLFREQUENCY1), SB_CTL);
  365.     ptWin->iUpperValue = GetScrollPos(GetItemHandle(DB_SCROLLFREQUENCY2), SB_CTL);
  366.     InvalidateRect(ptWin->HWindow, NULL, FALSE);
  367.     UpdateWindow(ptWin->HWindow);
  368. }
  369.  
  370. void TFilter2::WMInitDialog(RTMessage Msg)
  371. /****************************************************************************
  372. Denne initialiserer dialogboksen med de rette verdiene. I tillegg setter
  373. den min/maks verdi pσ scrollbarene.
  374.  
  375. Kodet av:    SA
  376. Modifisert:     MK     22.04.92  La inn dynamisk oppdatering av editkontrollene
  377.                                                      og oppdatering av foreldrevinduet.
  378. *****************************************************************************/
  379. {
  380.     char acMax[DB_EDITFREQUENCYLENGTH];
  381.     char acTitle[MAX_CAPTION_LENGTH];
  382.     RECT rectComplex, rect;
  383.     int i;
  384.  
  385.     //  Regner ut maksimalverdi som skal til for σ kunne dekke hele boksen
  386.     //  med en sirkel (ganger radiusen med sqrt(2)).
  387.     iMax = ceil(((TComplexWindow *)Parent)->bmpInfo->bmiHeader.biWidth*(1.415/2)); // Maks radius r^2=2*x^2 => r=sqrt(2)*x
  388.     TDialog::WMInitDialog(Msg);
  389.  
  390.     //  Setter standardverdier pσ filterringene.
  391.     wsprintf(acMax, "%d", iMax / 3);
  392.     SetDlgItemText(HWindow, DB_EDITFREQUENCY1, acMax);
  393.     wsprintf(acMax, "%d", 2*iMax/3);
  394.     SetDlgItemText(HWindow, DB_EDITFREQUENCY2, acMax);
  395.  
  396.     //  Setter range og startposisjon pσ scrollbarene
  397.     SetScrollRange(GetItemHandle(DB_SCROLLFREQUENCY1), SB_CTL, 0, iMax, TRUE);
  398.     SetScrollRange(GetItemHandle(DB_SCROLLFREQUENCY2), SB_CTL, 0, iMax, TRUE);
  399.     SetScrollPos(GetItemHandle(DB_SCROLLFREQUENCY1), SB_CTL, iMax/3, TRUE);
  400.     SetScrollPos(GetItemHandle(DB_SCROLLFREQUENCY2), SB_CTL, (2*iMax)/3, TRUE);
  401.  
  402.     //  Setter overskriften pσ filteret ut i fra hvilken type filter
  403.     //  brukeren har valgt.
  404.     lstrcpy(acTitle, alpTitle[((TComplexWindow *)Parent)->iFilterType-CM_FILTERLOWPASS]);
  405.     strcat(acTitle, " filter");
  406.     SetCaption(acTitle);
  407.  
  408.     //  Be foreldrevinduet vise filterringene (de r°de) nσr vinduet fσr
  409.     //  beskjed om σ vise seg igjen
  410.     ((TComplexWindow *)Parent)->bShowFilter = TRUE;
  411.  
  412.     //  Koden nedenfor fors°ker σ holde dialogboksen unna bildet, hvis mulig
  413.     //  ved σ plassere boksen rett under det aktive bildet.
  414.     GetWindowRect(((TComplexWindow *)Parent)->HWindow, &rectComplex);
  415.     GetWindowRect(HWindow, &rect);
  416.     i = GetSystemMetrics(SM_CYSCREEN);
  417.     i -= rectComplex.top;
  418.     i -= ((TComplexWindow *)Parent)->bmpInfo->bmiHeader.biHeight;
  419.     i -= rect.bottom-rect.top;
  420.     i -= FILTERDIALOGBOXDISTANCE;
  421.     if (i>0)
  422.     {
  423.         MoveWindow(HWindow, rectComplex.left, rectComplex.top+((TComplexWindow *)Parent)->bmpInfo->bmiHeader.biHeight
  424.                 +GetSystemMetrics(SM_CYCAPTION)+FILTERDIALOGBOXDISTANCE,rect.right-rect.left, rect.bottom-rect.top, TRUE);
  425.     }
  426. }
  427.  
  428. void TFilter2::WMHScroll(RTMessage Msg)
  429. /****************************************************************************
  430. Denne mottar beskjeder hvis brukeren holder tak i scrollbaren og drar.
  431. Denne s°rger for at tallene i dialogboksen og radiusen i foreldrevinduet
  432. hele tiden er oppdatert.
  433.  
  434. Kodet av:    SA
  435. Modifisert:     MK     22.04.92  La inn dynamisk oppdatering av editkontrollene
  436.                                                      og oppdatering av foreldrevinduet.
  437. *****************************************************************************/
  438. {
  439.     char acTemp[DB_EDITFREQUENCYLENGTH];
  440.     HWND hCtrl;
  441.     int nIndex, nCtrlID;
  442.  
  443.     //  Hvis brukeren drar i scrollbaren.
  444.     if ((Msg.WParam==SB_THUMBPOSITION) || (Msg.WParam==SB_THUMBTRACK))
  445.     {
  446.         hCtrl = HIWORD(Msg.LParam);
  447.  
  448.         //  Regner ut hvilken av scrollbarene brukeren drar i.
  449.         nCtrlID = GetWindowWord(hCtrl, GWW_ID);
  450.         nIndex = nCtrlID - DB_SCROLLFREQUENCY1;
  451.  
  452.         //  Setter riktig dialogboks tall tekst.
  453.         wsprintf(acTemp, "%d", GetScrollPos(
  454.                 GetItemHandle(DB_SCROLLFREQUENCY1+nIndex), SB_CTL));
  455.         SetDlgItemText(HWindow, DB_EDITFREQUENCY1+nIndex, acTemp);
  456.     }
  457.     TDialog::WMHScroll(Msg);
  458. }
  459.  
  460. #pragma argsused
  461. void TFilter2::IDHScrollBar1(RTMessage Msg)
  462. /****************************************************************************
  463. Denne mottar beskjeder nσr brukeren har forandret pσ den f°rste
  464. scrollbaren, dvs. indre radius pσ et filter. Den sjekker om det er en
  465. lovlig verdi, dvs. nedre verdi mσ vµre mindre eller lik °vre verdi.
  466.  
  467. Kodet av:    SA
  468. Modifisert:     MK     22.04.92  La inn dynamisk oppdatering av editkontrollene
  469.                                                      og oppdatering av foreldrevinduet.
  470. *****************************************************************************/
  471. {
  472.     int nTempL, nTempH;
  473.     char acTempL[DB_EDITFREQUENCYLENGTH];
  474.  
  475.     //  Henter verdiene fra dialogboksen.
  476.     nTempL = GetScrollPos(GetItemHandle(DB_SCROLLFREQUENCY1), SB_CTL);
  477.     nTempH = GetScrollPos(GetItemHandle(DB_SCROLLFREQUENCY2), SB_CTL);
  478.  
  479.     //  Hvis °vre verdi <= nedre verdi
  480.     if (nTempH <= nTempL)
  481.         {
  482.             //  Sett nedre verdi = °vre verdi
  483.             nTempL = nTempH;
  484.  
  485.             //  Oppdater scrollbaren
  486.             SetScrollPos(GetItemHandle(DB_SCROLLFREQUENCY1), SB_CTL, nTempL, TRUE);
  487.         }
  488.     //  Oppdater tall teksten i dialogboksen
  489.     wsprintf(acTempL, "%d", nTempL);
  490.     SetDlgItemText(HWindow, DB_EDITFREQUENCY1, acTempL);
  491. }
  492.  
  493. #pragma argsused
  494. void TFilter2::IDHScrollBar2(RTMessage Msg)
  495. /****************************************************************************
  496. Denne mottar beskjeder nσr brukeren har forandret pσ den andre
  497. scrollbaren, dvs. yttre radius pσ et filter. Den sjekker om det er en
  498. lovlig verdi, dvs. °vre verdi mσ vµre st°rre eller lik °vre verdi.
  499.  
  500. Kodet av:    SA
  501. Modifisert:     MK     22.04.92  La inn dynamisk oppdatering av editkontrollene
  502.                                                      og oppdatering av foreldrevinduet.
  503. *****************************************************************************/
  504. {
  505.     int nTempL, nTempH;
  506.     char acTempH[DB_EDITFREQUENCYLENGTH];
  507.  
  508.     //  Henter verdiene fra dialogboksen.
  509.     nTempL = GetScrollPos(GetItemHandle(DB_SCROLLFREQUENCY1), SB_CTL);
  510.     nTempH = GetScrollPos(GetItemHandle(DB_SCROLLFREQUENCY2), SB_CTL);
  511.  
  512.     //  Hvis °vre verdi <= nedre verdi
  513.     if (nTempH <= nTempL)
  514.         {
  515.             //  Sett °vre verdi = nedre verdi
  516.             nTempH = nTempL;
  517.             SetScrollPos(GetItemHandle(DB_SCROLLFREQUENCY2), SB_CTL, nTempH, TRUE);
  518.         }
  519.     //  Oppdater tall teksten i dialogboksen
  520.     wsprintf(acTempH, "%d", nTempH);
  521.     SetDlgItemText(HWindow, DB_EDITFREQUENCY2, acTempH);
  522. }
  523.  
  524. #pragma argsused
  525. void TFilter2::IDEditFrequency1(RTMessage Msg)
  526. /****************************************************************************
  527. Denne mottar beskjed nσr brukeren skriver inn et tall direkte i den
  528. f°rste radien. Oppdaterer scrollbaren og foreldrevinduet for σ vise den
  529. nye posisjonen.
  530.  
  531. Kodet av:    SA
  532. Modifisert:     MK     22.04.92  La inn dynamisk oppdatering av editkontrollene
  533.                                                      og oppdatering av foreldrevinduet.
  534. *****************************************************************************/
  535. {
  536.     int nTemp;
  537.     char acTempL[DB_EDITFREQUENCYLENGTH];
  538.     GetDlgItemText(HWindow, DB_EDITFREQUENCY1, acTempL, 10);
  539.     nTemp = atoi(acTempL);
  540.     SetScrollPos(GetItemHandle(DB_SCROLLFREQUENCY1), SB_CTL, nTemp, TRUE);
  541.     UpdateParent();
  542. }
  543.  
  544. #pragma argsused
  545. void TFilter2::IDEditFrequency2(RTMessage Msg)
  546. /****************************************************************************
  547. Denne mottar beskjed nσr brukeren skriver inn et tall direkte i den
  548. andre radien. Oppdaterer scrollbaren og foreldrevinduet for σ vise den
  549. nye posisjonen.
  550.  
  551. Kodet av:    SA
  552. Modifisert:     MK     22.04.92  La inn dynamisk oppdatering av editkontrollene
  553.                                                      og oppdatering av foreldrevinduet.
  554. *****************************************************************************/
  555. {
  556.     int nTemp;
  557.     char acTempH[DB_EDITFREQUENCYLENGTH];
  558.     GetDlgItemText(HWindow, DB_EDITFREQUENCY2, acTempH, 10);
  559.     nTemp = atoi(acTempH);
  560.     SetScrollPos(GetItemHandle(DB_SCROLLFREQUENCY2), SB_CTL, nTemp, TRUE);
  561.     UpdateParent();
  562. }
  563.  
  564. BOOL TFilter2::CanClose()
  565. /****************************************************************************
  566. Forteller om brukeren kan lukke dialogboksen. Siden verdiene alltid
  567. leses ut fra scrollbarene som alltid har en lovlig verdi, trenger vi
  568. ikke sjekke dette ekstra. Vi kunne eventuellt sjekket at det stσr et
  569. lovlig tall i tallfeltet, men siden filteret hele tiden vises dynamisk
  570. i foreldrevinduet, har vi sett bort i fra dette. "What you see is
  571. what you get.."
  572.  
  573. Returnerer:  TRUE  Alltid
  574.  
  575. Kodet av:    SA
  576. Modifisert:     MK     22.04.92     Fjernet un°dvendig kode.
  577. *****************************************************************************/
  578.  
  579. {
  580.     return TRUE;
  581. }
  582.  
  583. TFilter1::TFilter1(PTWindowsObject AParent, LPSTR AName)
  584.         : TDialog(AParent, AName)
  585. /****************************************************************************
  586. Dette er dialogboksen som brukes ved alle filtre som krever en radius.
  587. Dvs. CM_FILTERLOWPASS, CM_FILTERHIGHPASS, CM_FILTERBWLOWPASS,
  588. CM_FILTERBWHIGHPASS. Konstruktoren bare setter opp
  589. kontrollene i dialogboksen.
  590.  
  591. PTWindowsObject AParent        Peker til foreldreobjektet. Sendes uber°rt
  592.                                                     videre til superklassen.
  593.  
  594. LPSTR AName                                Navnet pσ dialogboksen i ressursfilen. Sendes
  595.                                                     uber°rt videre til superklassen.
  596.  
  597. Kodet av:    SA
  598. Modifisert:     MK     22.04.92  La inn dynamisk oppdatering av editkontrollene
  599.                                                      og oppdatering av foreldrevinduet.
  600. *****************************************************************************/
  601. {
  602.         new TEdit(this, DB_EDITFREQUENCY, DB_EDITFREQUENCYLENGTH);
  603.         new TScrollBar(this, DB_SCROLLFREQUENCY);
  604. }
  605.  
  606. void TFilter1::UpdateParent()
  607. /****************************************************************************
  608. Denne oppdaterer foreldreobjektet med de rette verdiene som brukeren
  609. velger v.h.a. dialogboksen.
  610.  
  611. Kodet av:    SA
  612. Modifisert:     MK     22.04.92  La inn dynamisk oppdatering av editkontrollene
  613.                                                      og oppdatering av foreldrevinduet.
  614. *****************************************************************************/
  615. {
  616.     TComplexWindow *ptWin;
  617.  
  618.     ptWin = ((TComplexWindow *)Parent);
  619.     ptWin->iLowerValue = GetScrollPos(GetItemHandle(DB_SCROLLFREQUENCY), SB_CTL);
  620.     ptWin->iUpperValue = -1;        // iUpperValue == -1 indikerer ingen 2. frekvens (°vre/nedre grensefrekvens)
  621.     InvalidateRect(((TComplexWindow *)Parent)->HWindow, NULL, FALSE);
  622.     UpdateWindow(((TComplexWindow *)Parent)->HWindow);
  623. }
  624.  
  625. void TFilter1::WMInitDialog(RTMessage Msg)
  626. /****************************************************************************
  627. Denne initialiserer dialogboksen med de rette verdiene. I tillegg setter
  628. den min/maks verdi pσ scrollbarene.
  629.  
  630. Kodet av:    SA
  631. Modifisert:     MK     22.04.92  La inn dynamisk oppdatering av editkontrollene
  632.                                                      og oppdatering av foreldrevinduet.
  633. *****************************************************************************/
  634. {
  635.     char acMax[DB_EDITFREQUENCYLENGTH];
  636.     char acTitle[MAX_CAPTION_LENGTH];
  637.     RECT rectComplex, rect;
  638.     int i;
  639.  
  640.     //  Regner ut startverdier og setter range pσ scrollbaren.
  641.     iMax = ceil(((TComplexWindow *)Parent)->bmpInfo->bmiHeader.biWidth*(1.415/2)); // Maks radius r^2=2*x^2 => r=sqrt(2)*x
  642.     wsprintf(acMax, "%d", iMax / 2);
  643.     TDialog::WMInitDialog(Msg);
  644.     SetDlgItemText(HWindow, DB_EDITFREQUENCY, acMax);
  645.     SetScrollRange(GetItemHandle(DB_SCROLLFREQUENCY), SB_CTL, 0, iMax, TRUE);
  646.     SetScrollPos(GetItemHandle(DB_SCROLLFREQUENCY), SB_CTL, 0, TRUE);
  647.     lstrcpy(acTitle, alpTitle[((TComplexWindow *)Parent)->iFilterType-CM_FILTERLOWPASS]);
  648.     strcat(acTitle, " filter");
  649.     SetCaption(acTitle);
  650.  
  651.     ((TComplexWindow *)Parent)->bShowFilter = TRUE;
  652.  
  653.     //  Koden nedenfor fors°ker σ holde dialogboksen unna bildet, hvis mulig ved σ plassere
  654.     //  boksen rett under det aktive bildet.
  655.     GetWindowRect(((TComplexWindow *)Parent)->HWindow, &rectComplex);
  656.     GetWindowRect(HWindow, &rect);
  657.     i = GetSystemMetrics(SM_CYSCREEN);
  658.     i -= rectComplex.top;
  659.     i -= ((TComplexWindow *)Parent)->bmpInfo->bmiHeader.biHeight;
  660.     i -= rect.bottom-rect.top;
  661.     i -= FILTERDIALOGBOXDISTANCE;
  662.     if (i>0)
  663.     {
  664.         MoveWindow(HWindow, rectComplex.left, rectComplex.top+((TComplexWindow *)Parent)->bmpInfo->bmiHeader.biHeight
  665.                 +GetSystemMetrics(SM_CYCAPTION)+FILTERDIALOGBOXDISTANCE,rect.right-rect.left, rect.bottom-rect.top, TRUE);
  666.     }
  667. }
  668.  
  669. #pragma argsused
  670. void TFilter1::IDHScrollBar(RTMessage Msg)
  671. /****************************************************************************
  672. Denne mottar beskjeder nσr brukeren har forandret pσ
  673. scrollbaren, dvs. indre radius pσ et filter.
  674.  
  675. Kodet av:    SA
  676. Modifisert:     MK     22.04.92  La inn dynamisk oppdatering av editkontrollene
  677.                                                      og oppdatering av foreldrevinduet.
  678. *****************************************************************************/
  679. {
  680.     int nTemp;
  681.     char acTemp[DB_EDITFREQUENCYLENGTH];
  682.  
  683.     //  Setter riktig verdi i editkontrollen
  684.     nTemp = GetScrollPos(GetItemHandle(DB_SCROLLFREQUENCY), SB_CTL);
  685.     wsprintf(acTemp, "%d", nTemp);
  686.     SetDlgItemText(HWindow, DB_EDITFREQUENCY, acTemp);
  687. }
  688.  
  689. void TFilter1::WMHScroll(RTMessage Msg)
  690. /****************************************************************************
  691. Denne mottar beskjeder hvis brukeren holder tak i scrollbaren og drar.
  692. Denne s°rger for at tallene i dialogboksen og radiusen i foreldrevinduet
  693. hele tiden er oppdatert.
  694.  
  695. Kodet av:    SA
  696. Modifisert:     MK     22.04.92  La inn dynamisk oppdatering av editkontrollene
  697.                                                      og oppdatering av foreldrevinduet.
  698. *****************************************************************************/
  699. {
  700.     char acTemp[DB_EDITFREQUENCYLENGTH];
  701.  
  702.     if ((Msg.WParam==SB_THUMBPOSITION) || (Msg.WParam==SB_THUMBTRACK))
  703.     {
  704.         wsprintf(acTemp, "%d", GetScrollPos(GetItemHandle(DB_SCROLLFREQUENCY), SB_CTL));
  705.         SetDlgItemText(HWindow, DB_EDITFREQUENCY, acTemp);
  706.     }
  707.     TDialog::WMHScroll(Msg);
  708. }
  709.  
  710. #pragma argsused
  711. void TFilter1::IDEditFrequency(RTMessage Msg)
  712. /****************************************************************************
  713. Denne mottar beskjed nσr brukeren skriver inn et tall direkte i edit
  714. kontrollen. Oppdaterer scrollbaren og foreldrevinduet for σ vise den
  715. nye posisjonen.
  716.  
  717. Kodet av:    SA
  718. Modifisert:     MK     22.04.92  La inn dynamisk oppdatering av editkontrollene
  719.                                                      og oppdatering av foreldrevinduet.
  720. *****************************************************************************/
  721. {
  722.     int nTemp;
  723.     char acTemp[DB_EDITFREQUENCYLENGTH];
  724.     GetDlgItemText(HWindow, DB_EDITFREQUENCY, acTemp, 10);
  725.     nTemp = atoi(acTemp);
  726.     SetScrollPos(GetItemHandle(DB_SCROLLFREQUENCY), SB_CTL, nTemp, TRUE);
  727.     UpdateParent();
  728. }
  729.  
  730. BOOL TFilter1::CanClose()
  731. /****************************************************************************
  732. Forteller om brukeren kan lukke dialogboksen. Siden verdiene alltid
  733. leses ut fra scrollbarene som alltid har en lovlig verdi, trenger vi
  734. ikke sjekke dette ekstra. Vi kunne eventuellt sjekket at det stσr et
  735. lovlig tall i tallfeltet, men siden filteret hele tiden vises dynamisk
  736. i foreldrevinduet, har vi sett bort i fra dette. "What you see is
  737. what you get.."
  738.  
  739. Returnerer:  TRUE  Alltid
  740.  
  741. Kodet av:    SA
  742. Modifisert:     MK     22.04.92  Fjernet un°dvendig kode.
  743. *****************************************************************************/
  744. {
  745.     return TRUE;
  746. }
  747.  
  748. void TComplexWindow::ExecuteSmallDialog()
  749. /****************************************************************************
  750. Starter opp den lille dialogboksen som brukes for de filtrene som
  751. krever en radius (CM_FILTERLOWPASS, CM_FILTERHIGHPASS, CM_FILTERBWLOWPASS,
  752. CM_FILTERBWHIGHPASS). Denne sjekker om verdiene som returneres er ok og
  753. om brukeren avsluttet filterdialogboksen med OK knappen f°r den starter
  754. filtreringen.
  755.  
  756. Fordi om dette er en medlemsfunksjon av TComplexWindow objektet og kanskje
  757. h°rer hjemme i COMPWIN.CPP modulen, valgte vi og samle de har sammen med
  758. de andre dialogboksene i systemet.
  759.  
  760. Kodet av:    MK  22.04.92
  761. *****************************************************************************/
  762. {
  763.     TFilter1 *tdFilter1;
  764.  
  765.     //  Instansiererer dialogboksen.
  766.     tdFilter1 = new TFilter1(this, "FILTER1");
  767.     if (tdFilter1==NULL)
  768.         MessageBox(HWindow, "TComplexWindow::ExecuteSmallDialog tdFilter1 == NULL",
  769.                 ERROR_CAPTION, MB_ERROR);
  770.     else
  771.     {
  772.         //  Utf°rer dialogboksen og sjekker returverdiene og om brukeren
  773.         //  avsluttet med OK knappen.
  774.         if ((GetApplication()->ExecDialog(tdFilter1)==IDOK)
  775.                 && (iLowerValue!=iUpperValue))
  776.             //  Starter filtreringen.
  777.             PrepareToExecuteFilter();
  778.         else
  779.         {
  780.             //  Hvis ikke fjern filtermarkeringen fra foreldrevinduet og
  781.             //  returner pσ vanlig mσte.
  782.             bShowFilter = FALSE;
  783.             InvalidateRect(HWindow, NULL, FALSE);
  784.         }
  785.     }
  786. }
  787.  
  788. void TComplexWindow::ExecuteLargeDialog()
  789. /****************************************************************************
  790. Starter opp den store dialogboksen som brukes for de filtrene som
  791. krever to radiuser (CM_FILTERBANDPASS, CM_FILTERBANDSTOP).
  792. Denne sjekker om verdiene som returneres er ok og
  793. om brukeren avsluttet filterdialogboksen med OK knappen f°r den starter
  794. filtreringen.
  795.  
  796. Fordi om dette er en medlemsfunksjon av TComplexWindow objektet og kanskje
  797. h°rer hjemme i COMPWIN.CPP modulen, valgte vi og samle de har sammen med
  798. de andre dialogboksene i systemet.
  799.  
  800. Kodet av:    MK  22.04.92
  801. *****************************************************************************/
  802. {
  803.     TFilter2 *tdFilter2;
  804.  
  805.     //  Instansiererer dialogboksen.
  806.     tdFilter2 = new TFilter2(this, "FILTER2");
  807.     if (tdFilter2==NULL)
  808.         MessageBox(HWindow, "TComplexWindow::ExecuteLargeDialog tdFilter2==NULL",
  809.                 ERROR_CAPTION, MB_ERROR);
  810.     else
  811.     {
  812.         //  Utf°rer dialogboksen og sjekker returverdiene og om brukeren
  813.         //  avsluttet med OK knappen.
  814.         if ((GetApplication()->ExecDialog(tdFilter2)==IDOK)
  815.                 && (iLowerValue!=iUpperValue))
  816.             //  Starter filtreringen.
  817.             PrepareToExecuteFilter();
  818.         else
  819.         {
  820.             //  Hvis ikke fjern filtermarkeringen fra foreldrevinduet og
  821.             //  returner pσ vanlig mσte.
  822.             bShowFilter = FALSE;
  823.             InvalidateRect(HWindow, NULL, FALSE);
  824.         }
  825.     }
  826. }
  827.  
  828.